package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.entity.ChatPrivateSessionUser;
import com.zenithmind.chat.pojo.vo.ChatPrivateSessionUserVO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 私聊会话用户关系服务接口 - 遵循单一职责原则
 * 只负责私聊会话用户关系的业务逻辑处理
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatPrivateSessionUserService extends IService<ChatPrivateSessionUser> {

    /**
     * 创建会话用户关系
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 关系ID
     */
    String createSessionUser(String sessionId, String userId);

    /**
     * 批量创建会话用户关系
     * 
     * @param sessionId 会话ID
     * @param userIds 用户ID列表
     * @return 创建结果
     */
    Boolean batchCreateSessionUsers(String sessionId, List<String> userIds);

    /**
     * 删除会话用户关系
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 删除结果
     */
    Boolean deleteSessionUser(String sessionId, String userId);

    /**
     * 根据会话ID查询用户列表
     * 
     * @param sessionId 会话ID
     * @return 用户关系列表
     */
    List<ChatPrivateSessionUserVO> getUsersBySessionId(String sessionId);

    /**
     * 根据用户ID查询会话列表
     * 
     * @param userId 用户ID
     * @return 会话关系列表
     */
    List<ChatPrivateSessionUserVO> getSessionsByUserId(String userId);

    /**
     * 查询会话用户关系
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 用户关系
     */
    ChatPrivateSessionUserVO getSessionUser(String sessionId, String userId);

    /**
     * 检查用户是否在会话中
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 是否在会话中
     */
    Boolean isUserInSession(String sessionId, String userId);

    /**
     * 更新最后访问时间
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param lastAccessTime 最后访问时间
     * @return 更新结果
     */
    Boolean updateLastAccessTime(String sessionId, String userId, LocalDateTime lastAccessTime);

    /**
     * 更新最后访问时间为当前时间
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean updateLastAccessTimeToNow(String sessionId, String userId);

    /**
     * 更新未读消息数
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param unreadCount 未读消息数
     * @return 更新结果
     */
    Boolean updateUnreadCount(String sessionId, String userId, Integer unreadCount);

    /**
     * 增加未读消息数
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean incrementUnreadCount(String sessionId, String userId);

    /**
     * 清零未读消息数
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean clearUnreadCount(String sessionId, String userId);

    /**
     * 批量清零未读消息数
     * 
     * @param sessionIds 会话ID列表
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean batchClearUnreadCount(List<String> sessionIds, String userId);

    /**
     * 更新会话置顶状态
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param isTop 是否置顶
     * @return 更新结果
     */
    Boolean updateTopStatus(String sessionId, String userId, Boolean isTop);

    /**
     * 更新会话免打扰状态
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param isMuted 是否免打扰
     * @return 更新结果
     */
    Boolean updateMuteStatus(String sessionId, String userId, Boolean isMuted);

    /**
     * 查询用户的置顶会话列表
     * 
     * @param userId 用户ID
     * @return 置顶会话列表
     */
    List<ChatPrivateSessionUserVO> getTopSessionsByUserId(String userId);

    /**
     * 查询用户的免打扰会话列表
     * 
     * @param userId 用户ID
     * @return 免打扰会话列表
     */
    List<ChatPrivateSessionUserVO> getMutedSessionsByUserId(String userId);

    /**
     * 统计用户未读消息总数
     * 
     * @param userId 用户ID
     * @return 未读消息总数
     */
    Long countTotalUnreadByUserId(String userId);

    /**
     * 获取用户在指定会话的未读消息数
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 未读消息数
     */
    Integer getUnreadCountBySession(String sessionId, String userId);

    /**
     * 获取用户活跃会话列表
     * 
     * @param userId 用户ID
     * @param limit 数量限制
     * @return 活跃会话列表
     */
    List<ChatPrivateSessionUserVO> getActiveSessionsByUserId(String userId, Integer limit);

    /**
     * 更新最后阅读时间
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param lastReadTime 最后阅读时间
     * @return 更新结果
     */
    Boolean updateLastReadTime(String sessionId, String userId, LocalDateTime lastReadTime);

    /**
     * 更新最后阅读时间为当前时间
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean updateLastReadTimeToNow(String sessionId, String userId);

    /**
     * 批量更新最后访问时间
     * 
     * @param sessionIds 会话ID列表
     * @param userId 用户ID
     * @param lastAccessTime 最后访问时间
     * @return 更新结果
     */
    Boolean batchUpdateLastAccessTime(List<String> sessionIds, String userId, LocalDateTime lastAccessTime);

    /**
     * 获取会话的所有用户ID
     * 
     * @param sessionId 会话ID
     * @return 用户ID列表
     */
    List<String> getUserIdsBySessionId(String sessionId);

    /**
     * 获取用户的所有会话ID
     * 
     * @param userId 用户ID
     * @return 会话ID列表
     */
    List<String> getSessionIdsByUserId(String userId);

    /**
     * 检查两个用户是否有共同会话
     * 
     * @param userId1 用户1ID
     * @param userId2 用户2ID
     * @return 是否有共同会话
     */
    Boolean hasCommonSession(String userId1, String userId2);

    /**
     * 获取两个用户的共同会话列表
     * 
     * @param userId1 用户1ID
     * @param userId2 用户2ID
     * @return 共同会话列表
     */
    List<ChatPrivateSessionUserVO> getCommonSessions(String userId1, String userId2);

    /**
     * 统计用户会话数量
     * 
     * @param userId 用户ID
     * @return 会话数量
     */
    Long countSessionsByUserId(String userId);

    /**
     * 统计会话用户数量
     * 
     * @param sessionId 会话ID
     * @return 用户数量
     */
    Long countUsersBySessionId(String sessionId);

    /**
     * 清理不活跃的会话关系
     * 
     * @param inactiveDays 不活跃天数
     * @return 清理数量
     */
    Integer cleanupInactiveSessionUsers(Integer inactiveDays);

    /**
     * 归档会话关系
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param isArchived 是否归档
     * @return 归档结果
     */
    Boolean archiveSessionUser(String sessionId, String userId, Boolean isArchived);

    /**
     * 获取用户的归档会话列表
     * 
     * @param userId 用户ID
     * @return 归档会话列表
     */
    List<ChatPrivateSessionUserVO> getArchivedSessionsByUserId(String userId);

    /**
     * 批量归档会话关系
     * 
     * @param sessionIds 会话ID列表
     * @param userId 用户ID
     * @param isArchived 是否归档
     * @return 归档结果
     */
    Boolean batchArchiveSessionUsers(List<String> sessionIds, String userId, Boolean isArchived);
}
